#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

#define N 10


void RunChild()
{
    int cnt = 5;
    while (cnt)
    {
        printf("I am a child Process,pid: %d,ppid: %d\n",getpid(),getppid());
        sleep(1);
        cnt--;
    }
}


#define TASK_NUM 10

typedef void(*task_t)();

task_t task[TASK_NUM];

void task1()
{
    printf("这是一个打印日志任务的操作\n");
}


void task2()
{
    printf("这是一个执行网络健康状态的任务\n");
}

void task3()
{
    printf("这是一个进行绘制图形的任务\n");
}

void InitTask()
{
    for (int i = 0; i < TASK_NUM; i++)
    {
        task[i] = NULL;
    }
}

int AddTask(task_t t)
{
    for (int i = 0; i < TASK_NUM; i++ )
    {
        int pos = 0;
        for (;pos < TASK_NUM; pos++)
        {
            if (!task[pos]) break;
        }

        if (pos == TASK_NUM) return -1;

        task[pos] = t;

        return 0;
    }
}

void ExecuteTask()
{
    for (int i = 0; i < TASK_NUM; i++)
    {
        if (!task[i]) continue;

        task[i]();
    }
}

int main()
{
   // for (int i = 0; i < N; i++)
   // {
   //     pid_t id = fork();

   //     if (id == 0)
   //     {
   //         RunChild();
   //         exit(i);
   //     }

   //     printf("create child process: %d sucess\n",id);
   // }

   // sleep(10);

   // for (int i = 0;  i < N; i++)
   // {

   //     //等待
   //    // pid_t id = wait(NULL);
   //    int status = 0;
   //    pid_t id = waitpid(-1,&status,0);
   //     if (id > 0)
   //     {
   //         printf("wait %d success,exit code: %d\n",id,WEXITSTATUS(status));
   //     }

   // }
   pid_t id = fork();

    if (id < 0)
   {       perror("fork: ");
        return 1;
    }
    else if (id == 0)
    {
        int cnt = 5;
        while (cnt)
        {
            printf("I am child,pid: %d,ppid: %d,cnt: %d\n",getpid(),getppid(),cnt);
            cnt--;
//            sleep(1);
        }
        exit(1);
    }
    else{
       // int cnt = 10;
       // while (cnt)
       // {
        //    printf("I am father,pid: %d,ppid: %d,cnt: %d\n",getpid(),getppid(),cnt);
        //    cnt--;
        //    sleep(1);
       // }
       // pid_t ret = wait(NULL);
       int status = 0;
       InitTask();
       AddTask(task1);
       AddTask(task2);
       AddTask(task3);

       while (1)
       {
       pid_t ret = waitpid(id,&status,WNOHANG);
             if (ret > 0)
             {
                 // printf("wait success,ret: %d,sgin exit: %d,exit code: %d\n",ret,status&0x7f,(status>>8)&0xff);
                 if (WIFEXITED(status))
                 {
                     printf("进程是正常跑完的,退出码: %d\n",WEXITSTATUS(status));
                 }
                 else{
                     printf("进程出异常了\n");
                 }

                 break;
             }
             else if(ret < 0){
                 printf("wait fail\n");
                 break;
                 
             }
             else 
             {
                ExecuteTask();
                // printf("子进程还没有退出\n");
       //          sleep(1);
             }

        }
//             sleep(5);
    }
}
